﻿Imports System.IO
Imports System.IO.MemoryStream
Public Class frmFacturasNew
    Public cierrecaja As Boolean
    ''' <summary>
    ''' Metodo que construye el menu de acceso rápido ubicado en la parte inferior de la pantalla
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub ConstruirBotones()
        Try
            BotonesPersonalizadosSGS.ConstruirMenuRapidoFacturacion(txt1, btn1, txt2, btn2, txt3, btn3, txt4, btn4, txt5, btn5, txt6, btn6, txt7, btn7, txt8, btn8, txt9, btn9)
        Catch ex As Exception
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgVinicio, "Error al momento de construir los botones personalizados en la pantalla de facturación", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "ConstruirBotones")
        End Try
    End Sub
    ''' <summary>
    ''' Metodo que limpia los controles dejandolos listos para una nueva factura
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub LimpiarPantalla()
        Try
            'Inicializa o limpia los controles
            tNombrePC.Text = My.Computer.Name
            subsidiodisp.EditValue = 0
            subsidiootorgado.EditValue = 0
            IdUsuario.EditValue = CInt(My.Forms.MDI.Iduser.Caption.ToString)
            IditemventaTextEdit.EditValue = Nothing
            IdclienteTextEdit.Focus()
            tprecioventa.EditValue = 0
            tcantidad.Value = 0
            ttotallinea.EditValue = 0
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al momento de inicializar los controles.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "No se calculó el ultimo idfactura de esta cajaHa ocurrido un error al momento de inicializar los controles.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "LimpiarPantalla()")
        End Try
        'cargando cliente default
        Try
            IdclienteTextEdit.EditValue = ConexionSGS.EjecutarQueryScalar("select idcliente from clientes where esdefault = 'true'")
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "No actualizaron los datos del cliente.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error cargando el cliente default, en frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "LimpiarPantalla()")
        End Try
        Try
            'Limpia los mensajes de error (ErrorProvider)
            ErrorProvider1.SetError(IditemventaTextEdit, Nothing)
            ErrorProvider1.SetError(tprecioventa, Nothing)
            ErrorProvider1.SetError(tcantidad, Nothing)
            ErrorProvider1.SetError(IdUsuario, Nothing)
            ErrorProvider1.SetError(IdclienteTextEdit, Nothing)
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ocurrió un error al momento de limpiar los mensajes de error (ErrorProvider).")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Ocurrió un error al momento de limpiar los mensajes de error (ErrorProvider).", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "LimpiarPantalla()")
        End Try
    End Sub
    ''' <summary>
    ''' Metodo que carga los LookUpSecundarios los cuales corresponden a lookup del nombre y del código del Cliente
    ''' </summary>
    ''' <param name="LookUp">Corresponde al objeto LookUpEdit</param>
    ''' <remarks></remarks>
    Public Sub CargarLookUpSecundarios(ByRef LookUp As DevExpress.XtraEditors.LookUpEdit)
        Try
            If tCliente.EditValue <> Nothing Then
                IdclienteTextEdit.EditValue = LookUp.GetColumnValue("idcliente")
                ActualizarLookUpPrincipal()
            End If
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "No se cargaron algunos datos del cliente.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en el tCliente_EditValueChanged en frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "CargarLookUpSecundarios()")
        End Try
    End Sub
    ''' <summary>
    ''' Metodo que carga todos los controles con la data del dataset y por ende  de las tablas
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub CargarDatos()
        'Cargar EMPRESAS
        Me.EmpresasTableAdapter.Fill(Me.DbFireAndIceDataSet.empresas)
        'Cargar vista VCLIENTE
        Me.VclienteTableAdapter.Fill(Me.DbFireAndIceDataSet.vcliente)
        'Cargar USUARIOS
        Me.UsuariosTableAdapter.Fill(Me.DbFireAndIceDataSet.usuarios)
        'Cargar ITEMVENTA
        Me.ItemventaTableAdapter.Fill(Me.DbFireAndIceDataSet.itemventa)
    End Sub
    ''' <summary>
    ''' Metodo que hace validaciones especiales para la empresa de Cargill
    ''' </summary>
    ''' <param name="iditem"></param>
    ''' <param name="accion"></param>
    ''' <param name="subconsumido"></param>
    ''' <remarks></remarks>
    Public Sub ValidaSubsidioCargill(ByVal iditem As Integer, ByVal accion As Integer, ByVal subconsumido As Double)
        Dim idempresa As Integer
        idempresa = ConexionSGS.EjecutarQueryScalar(String.Format("select idempresa from clientes where idcliente = '{0}';", IdclienteTextEdit.EditValue))
        If idempresa = 10 Then
            'setear el subsidio a 0
            subsidiodisp.EditValue = 0
            Dim itemsubsidiado As Integer = ConexionSGS.EjecutarQueryScalar(String.Format("select iditemventa from empresaitemsubsidiado where idempresa = {0}", idempresa))
            'Si la accion es agregar (1)
            If accion = 1 Then
                If iditem = itemsubsidiado Then
                    subsidiodisp.EditValue = subsidiootorgado.EditValue - subconsumido
                End If
            End If
            'Si la accion es eliminar (2)
            If accion = 2 Then
                If iditem = itemsubsidiado Then
                    subsidiodisp.EditValue = 0
                End If
            End If
            'Si el item está en el detalle otorgar el subsidio
            Dim itemsubsidiadoendetalle As Integer = ConexionSGS.EjecutarQueryScalar(String.Format("select count(iditemventa) from facturasdetalletemp where iditemventa = {0}", itemsubsidiado))
            If itemsubsidiadoendetalle > 0 Then
                subsidiodisp.EditValue = subsidiootorgado.EditValue - subconsumido
            End If
        End If
    End Sub
    ''' <summary>
    ''' Metodo que obtiene el subsidio disponible
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub ObtenerSubsidioDisponible()
        Dim consumodia As Integer = 0
        consumodia = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT SUM(facturaspago.montopago) AS montoconsumido FROM facturaspago INNER JOIN facturas ON facturaspago.idfactura = facturas.idfactura GROUP BY facturas.fecha, facturas.idcliente, facturaspago.idtipopago, facturas.nula HAVING (facturas.fecha = (SELECT CURRENT_DATE)) AND (facturas.idcliente = '{0}') AND (facturaspago.idtipopago = 2) AND (facturas.nula = 'false')", IdclienteTextEdit.EditValue))
        subsidiodisp.EditValue = subsidiootorgado.EditValue - consumodia
        'Validacion para subsidio de Cargill
        ValidaSubsidioCargill(0, 0, consumodia)
    End Sub
    ''' <summary>
    ''' Metodo que obtiene la foto del Cliente
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub ObtenerFotoCliente()
        If IsDBNull(IdclienteTextEdit.GetColumnValue("fotografia")) Then
            Dim fotoNA As Byte()
            fotoNA = ConexionSGS.EjecutarQueryScalar("select fotografia from clientes where idcliente = '1'")
            Dim data As Byte() = fotoNA
            Dim ms As System.IO.MemoryStream = New MemoryStream(data)
            foto.Image = Image.FromStream(ms)
        Else
            Dim data As Byte() = IdclienteTextEdit.GetColumnValue("fotografia")
            Dim ms As System.IO.MemoryStream = New MemoryStream(data)
            foto.Image = Image.FromStream(ms)
        End If
    End Sub
    ''' <summary>
    ''' Metodo que actualiza el LookUpEdit principal que corresponde al número de identidad
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub ActualizarLookUpPrincipal()
        IdempresaTextEdit.EditValue = IdclienteTextEdit.GetColumnValue("idempresa")
        subsidiootorgado.EditValue = IdclienteTextEdit.GetColumnValue("montosubsidio")
        tCliente.EditValue = IdclienteTextEdit.GetColumnValue("idcliente")
        tcodigol.EditValue = IdclienteTextEdit.GetColumnValue("idcliente")
        ObtenerFotoCliente()
    End Sub
    ''' <summary>
    ''' Metodo principal que actualiza los datos del Cliente
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub ActualizaDatoscliente()
        ActualizarLookUpPrincipal()
        ObtenerSubsidioDisponible()
    End Sub
    Private Sub frmFacturasNew_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Try
            'Función que construye el menú rápido
            ConstruirBotones()

            'Carga de data inicial en los controles
            CargarDatos()

            'Define la variable que controla si el llamado de cerrar la pantalla es desde la pantalla de cierre caja
            cierrecaja = False

            'Limpia la pantalla de factura y setea valores por defecto dejando lista una nueva factura
            LimpiarPantalla()
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, My.Resources.StringGlobal.msjNotificacion, My.Resources.StringGlobal.ErrorCargarDatos)
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al cargar los datos en el LOAD del formulario.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try

    End Sub

    Private Sub IdclienteTextEdit_EditValueChanged(sender As System.Object, e As System.EventArgs) Handles IdclienteTextEdit.EditValueChanged
        Try
            If IdclienteTextEdit.EditValue <> Nothing Then
                ActualizaDatoscliente()
            End If
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "No actualizaron los datos del cliente.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en IdclienteTextEdit_EditValueChanged, en frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Private Sub tCliente_EditValueChanged(sender As System.Object, e As System.EventArgs) Handles tCliente.EditValueChanged
        CargarLookUpSecundarios(tCliente)
    End Sub

    Private Sub tcodigol_EditValueChanged(sender As System.Object, e As System.EventArgs) Handles tcodigol.EditValueChanged
        CargarLookUpSecundarios(tcodigol)
    End Sub

    Private Sub IditemventaTextEdit_EditValueChanged(sender As System.Object, e As System.EventArgs) Handles IditemventaTextEdit.EditValueChanged
        Try
            If IditemventaTextEdit.EditValue <> Nothing Then
                Dim row As DataRowView = CType(IditemventaTextEdit.Properties.GetRowByKeyValue(IditemventaTextEdit.EditValue), DataRowView)
                Dim precio As Object = row("precioventa")
                tprecioventa.EditValue = precio
                tcantidad.Value = 1
                ttotallinea.EditValue = 0
                ttotallinea.EditValue = tprecioventa.EditValue * tcantidad.Value
            End If
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "No actualizaron los datos del producto a vender.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en IditemventaTextEdit_EditValueChanged, en frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Private Sub tcantidad_EditValueChanged(sender As System.Object, e As System.EventArgs) Handles tcantidad.EditValueChanged
        Try
            If IditemventaTextEdit.EditValue <> Nothing Then
                If IditemventaTextEdit.EditValue = 139 Then
                    tcantidad.Value = 1
                End If
                ttotallinea.EditValue = tprecioventa.EditValue * tcantidad.Value
            End If
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ocurrió un error al actualizar la cantidad del producto venta.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en tcantidad_EditValueChanged, en frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Private Sub btAgregar_Click(sender As System.Object, e As System.EventArgs) Handles btAgregar.Click

    
    End Sub

End Class